package org.dbp.registros.propertysupport;

import java.beans.PropertyEditorSupport;
import java.text.NumberFormat;

import org.springframework.util.StringUtils;
import org.springframework.util.NumberUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;


/**
 * 
 * Se encarga de pasar los datos de cadena de texto, a valor para los n�meros.,
 * 
 * Nota: Se ha implementado siguiendo el c�digo de spring source.
 * 
 * TODO: Implementar de nuevo la clase, para quitar las dependencias de springSource.
 * 
 * @author dbp
 *
 */
public class NumerosDbpRegistro extends PropertyEditorSupport{

	private static final Logger logger = LoggerFactory.getLogger(NumerosDbpRegistro.class); // NOPMD by dbp on 2/07/13 11:22 (Es la forma de escribir el logger)
	
	private final Class numeroClase; // NOPMD by dbp on 2/07/13 11:05
	private final NumberFormat numberFormat; // NOPMD by dbp on 2/07/13 11:05
	private final Boolean permitirVacia; // NOPMD by dbp on 2/07/13 11:05
	/**
	 * 
	 * Constructor del registro para n�meros.
	 * 
	 * @param numeroClase	La clase n�merico.
	 * @param numberFormat	Formateador.
	 */
	public NumerosDbpRegistro(final Class numeroClase,final NumberFormat numberFormat,final Boolean permitirVacia) { // NOPMD by dbp on 2/07/13 11:08
		if (numeroClase == null || !Number.class.isAssignableFrom(numeroClase)) {
			throw new IllegalArgumentException("Se espera que la clase sea de tipo n�merico.");
		}
		this.numeroClase = numeroClase;
		this.numberFormat = numberFormat;
		this.permitirVacia=permitirVacia;
	} 
	
	@Override
	public void setAsText(final String text) throws IllegalArgumentException {
		Object numero;
		if (this.permitirVacia && !StringUtils.hasText(text)) {
			numero=null;
		}
		else if (this.numberFormat == null) { 
			numero=NumberUtils.parseNumber(text, this.numeroClase);	
		}
		else {
			numero=NumberUtils.parseNumber(text, this.numeroClase, this.numberFormat);
		}
		logger.debug("El número que hemos obtenido de [{}] el valor [{}]"
				,text
				,numero);
		setValue(numero);
	}
	@Override
	public void setValue(final Object value) {
		if (value instanceof Number) {
			super.setValue(NumberUtils.convertNumberToTargetClass((Number) value, this.numeroClase));
		}
		else {
			super.setValue(value);
		}
	}

	@Override
	public String getAsText() {
		final Object value = getValue();
	    String valdev;
		if (value == null) {
			valdev= "";
		}else if (this.numberFormat == null){
			valdev= value.toString();
		}else{
			valdev=this.numberFormat.format(value);
		}
		logger.debug("Para el valor [{}] nos devuelve la siguiente cadena [{}]",value,valdev);
		return valdev;
	}
	
}
